#include"tcp_server.hpp"
#include"Common.hpp"
#include"Accepter.hpp"
#include<iostream>

// 整体代码模块：Reactor反应堆设计模式，体现半同步半异步

int main(int argc, char* argv[])
{
    if(argc!=2)
    {
        std::cout<<"illegal usage, please input: "<<argv[0]<<" server_port"<<std::endl;
    }
    uint16_t server_port = std::stoi(argv[1]);

    // 1.创建listen套接字
    std::unique_ptr<NetWork::Socket> listen_sock = std::make_unique<NetWork::TcpSocket>();
    listen_sock->BuildListenSocketMethod(server_port);
    SetNoneBlock(listen_sock->GetSockFd());// 设置为非阻塞IO，便于读取新的套接字

    // 2.创建TCP服务器
    std::unique_ptr<TcpServer> ts = std::make_unique<TcpServer>(server_port);
    std::unique_ptr<Accepter> ac = std::make_unique<Accepter>();

    func_t listen_recver = std::bind(&Accepter::AcceptConnection, ac.get(), std::placeholders::_1);   // 绑定accept函数逻辑
    // 3.构建listen_sock对应的Connection，并添加到服务器中
    Connection* conn = ConnectionFactory::BulidListenConnection(listen_sock->GetSockFd(), listen_recver, EPOLLIN | EPOLLET, ts.get());   // 设置读和ET模式
    ts->AddConnection(conn);
    // 4.进行事件派发，到这里已经完成了三次握手
    ts->Dispatcher();

}